]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
windowManager: Allow switching workspaces with super-scroll
authorFlorian Müllner <fmuellner@gnome.org>
Fri, 29 Jan 2021 19:33:23 +0000 (20:33 +0100)
committerMarge Bot <marge-bot@gnome.org>
Thu, 4 Feb 2021 20:04:15 +0000 (20:04 +0000)
So far, we couldn't allow workspace scrolling outside the overview
because scroll events were always sent to clients. However mutter
was changed recently to pass on scroll events when the mouse button
modifier (usually super) is pressed, which allows us to enable the
same workspace scrolling as in the overview now.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1612>

js/ui/windowManager.js
js/ui/workspaceAnimation.js

index f4176dae6722b2cd84f964f65f942689ab1507c6..f113fed385df404bffa2a6ae972170d18c2a2d42 100644 (file)
@@ -862,6 +862,16 @@ var WindowManager = class {
                            Shell.ActionMode.OVERVIEW,
                            this._switchToApplication.bind(this));
 
+        global.stage.connect('scroll-event', (stage, event) => {
+            if (this._workspaceAnimation.canHandleScrollEvent(event))
+                return Clutter.EVENT_PROPAGATE;
+
+            if ((event.get_state() & global.display.compositor_modifiers) === 0)
+                return Clutter.EVENT_PROPAGATE;
+
+            return this.handleWorkspaceScroll(event);
+        });
+
         global.display.connect('show-resize-popup', this._showResizePopup.bind(this));
         global.display.connect('show-pad-osd', this._showPadOsd.bind(this));
         global.display.connect('show-osd', (display, monitorIndex, iconName, label) => {
index 856da8f491ed3d98d3d5c90044efadbbcd8a383c..6cac580e71b750ba1ba25d1636c1b6534b3dd15b 100644 (file)
@@ -284,11 +284,15 @@ var WorkspaceAnimationController = class {
         });
 
         const swipeTracker = new SwipeTracker.SwipeTracker(global.stage,
-            Shell.ActionMode.NORMAL, { allowDrag: false, allowScroll: false });
+            Shell.ActionMode.NORMAL, { allowDrag: false });
         swipeTracker.connect('begin', this._switchWorkspaceBegin.bind(this));
         swipeTracker.connect('update', this._switchWorkspaceUpdate.bind(this));
         swipeTracker.connect('end', this._switchWorkspaceEnd.bind(this));
         this._swipeTracker = swipeTracker;
+
+        global.display.bind_property('compositor-modifiers',
+            this._swipeTracker, 'scroll-modifiers',
+            GObject.BindingFlags.SYNC_CREATE);
     }
 
     _prepareWorkspaceSwitch(workspaceIndices) {
@@ -390,6 +394,10 @@ var WorkspaceAnimationController = class {
         }
     }
 
+    canHandleScrollEvent(event) {
+        return this._swipeTracker.canHandleScrollEvent(event);
+    }
+
     _findMonitorGroup(monitorIndex) {
         return this._switchData.monitors.find(m => m.index === monitorIndex);
     }